{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "greatest-growth",
   "metadata": {},
   "source": [
    "## 逻辑回归"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "existing-queens",
   "metadata": {},
   "source": [
    "### 导入数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "hollywood-exercise",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression as LR \n",
    "from sklearn.datasets import load_breast_cancer \n",
    "import numpy as np \n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt \n",
    "from sklearn.model_selection import train_test_split \n",
    "from sklearn.metrics import accuracy_score \n",
    "data = load_breast_cancer() \n",
    "X = data.data \n",
    "y = data.target "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "stuck-surname",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>7</th>\n",
       "      <th>8</th>\n",
       "      <th>9</th>\n",
       "      <th>...</th>\n",
       "      <th>20</th>\n",
       "      <th>21</th>\n",
       "      <th>22</th>\n",
       "      <th>23</th>\n",
       "      <th>24</th>\n",
       "      <th>25</th>\n",
       "      <th>26</th>\n",
       "      <th>27</th>\n",
       "      <th>28</th>\n",
       "      <th>29</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>17.99</td>\n",
       "      <td>10.38</td>\n",
       "      <td>122.80</td>\n",
       "      <td>1001.0</td>\n",
       "      <td>0.11840</td>\n",
       "      <td>0.27760</td>\n",
       "      <td>0.3001</td>\n",
       "      <td>0.14710</td>\n",
       "      <td>0.2419</td>\n",
       "      <td>0.07871</td>\n",
       "      <td>...</td>\n",
       "      <td>25.38</td>\n",
       "      <td>17.33</td>\n",
       "      <td>184.60</td>\n",
       "      <td>2019.0</td>\n",
       "      <td>0.1622</td>\n",
       "      <td>0.6656</td>\n",
       "      <td>0.7119</td>\n",
       "      <td>0.2654</td>\n",
       "      <td>0.4601</td>\n",
       "      <td>0.11890</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20.57</td>\n",
       "      <td>17.77</td>\n",
       "      <td>132.90</td>\n",
       "      <td>1326.0</td>\n",
       "      <td>0.08474</td>\n",
       "      <td>0.07864</td>\n",
       "      <td>0.0869</td>\n",
       "      <td>0.07017</td>\n",
       "      <td>0.1812</td>\n",
       "      <td>0.05667</td>\n",
       "      <td>...</td>\n",
       "      <td>24.99</td>\n",
       "      <td>23.41</td>\n",
       "      <td>158.80</td>\n",
       "      <td>1956.0</td>\n",
       "      <td>0.1238</td>\n",
       "      <td>0.1866</td>\n",
       "      <td>0.2416</td>\n",
       "      <td>0.1860</td>\n",
       "      <td>0.2750</td>\n",
       "      <td>0.08902</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>19.69</td>\n",
       "      <td>21.25</td>\n",
       "      <td>130.00</td>\n",
       "      <td>1203.0</td>\n",
       "      <td>0.10960</td>\n",
       "      <td>0.15990</td>\n",
       "      <td>0.1974</td>\n",
       "      <td>0.12790</td>\n",
       "      <td>0.2069</td>\n",
       "      <td>0.05999</td>\n",
       "      <td>...</td>\n",
       "      <td>23.57</td>\n",
       "      <td>25.53</td>\n",
       "      <td>152.50</td>\n",
       "      <td>1709.0</td>\n",
       "      <td>0.1444</td>\n",
       "      <td>0.4245</td>\n",
       "      <td>0.4504</td>\n",
       "      <td>0.2430</td>\n",
       "      <td>0.3613</td>\n",
       "      <td>0.08758</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>11.42</td>\n",
       "      <td>20.38</td>\n",
       "      <td>77.58</td>\n",
       "      <td>386.1</td>\n",
       "      <td>0.14250</td>\n",
       "      <td>0.28390</td>\n",
       "      <td>0.2414</td>\n",
       "      <td>0.10520</td>\n",
       "      <td>0.2597</td>\n",
       "      <td>0.09744</td>\n",
       "      <td>...</td>\n",
       "      <td>14.91</td>\n",
       "      <td>26.50</td>\n",
       "      <td>98.87</td>\n",
       "      <td>567.7</td>\n",
       "      <td>0.2098</td>\n",
       "      <td>0.8663</td>\n",
       "      <td>0.6869</td>\n",
       "      <td>0.2575</td>\n",
       "      <td>0.6638</td>\n",
       "      <td>0.17300</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20.29</td>\n",
       "      <td>14.34</td>\n",
       "      <td>135.10</td>\n",
       "      <td>1297.0</td>\n",
       "      <td>0.10030</td>\n",
       "      <td>0.13280</td>\n",
       "      <td>0.1980</td>\n",
       "      <td>0.10430</td>\n",
       "      <td>0.1809</td>\n",
       "      <td>0.05883</td>\n",
       "      <td>...</td>\n",
       "      <td>22.54</td>\n",
       "      <td>16.67</td>\n",
       "      <td>152.20</td>\n",
       "      <td>1575.0</td>\n",
       "      <td>0.1374</td>\n",
       "      <td>0.2050</td>\n",
       "      <td>0.4000</td>\n",
       "      <td>0.1625</td>\n",
       "      <td>0.2364</td>\n",
       "      <td>0.07678</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 30 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      0      1       2       3        4        5       6        7       8   \\\n",
       "0  17.99  10.38  122.80  1001.0  0.11840  0.27760  0.3001  0.14710  0.2419   \n",
       "1  20.57  17.77  132.90  1326.0  0.08474  0.07864  0.0869  0.07017  0.1812   \n",
       "2  19.69  21.25  130.00  1203.0  0.10960  0.15990  0.1974  0.12790  0.2069   \n",
       "3  11.42  20.38   77.58   386.1  0.14250  0.28390  0.2414  0.10520  0.2597   \n",
       "4  20.29  14.34  135.10  1297.0  0.10030  0.13280  0.1980  0.10430  0.1809   \n",
       "\n",
       "        9   ...     20     21      22      23      24      25      26      27  \\\n",
       "0  0.07871  ...  25.38  17.33  184.60  2019.0  0.1622  0.6656  0.7119  0.2654   \n",
       "1  0.05667  ...  24.99  23.41  158.80  1956.0  0.1238  0.1866  0.2416  0.1860   \n",
       "2  0.05999  ...  23.57  25.53  152.50  1709.0  0.1444  0.4245  0.4504  0.2430   \n",
       "3  0.09744  ...  14.91  26.50   98.87   567.7  0.2098  0.8663  0.6869  0.2575   \n",
       "4  0.05883  ...  22.54  16.67  152.20  1575.0  0.1374  0.2050  0.4000  0.1625   \n",
       "\n",
       "       28       29  \n",
       "0  0.4601  0.11890  \n",
       "1  0.2750  0.08902  \n",
       "2  0.3613  0.08758  \n",
       "3  0.6638  0.17300  \n",
       "4  0.2364  0.07678  \n",
       "\n",
       "[5 rows x 30 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame(X).head()#考虑去量纲（标准化）"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "usual-breeding",
   "metadata": {},
   "source": [
    "### 建模"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "bibliographic-restoration",
   "metadata": {},
   "outputs": [],
   "source": [
    "data.shape \n",
    "lrl1 = LR(penalty=\"l1\",solver=\"liblinear\",C=0.5,max_iter=1000) \n",
    "#逻辑回归的重要属性coef_，查看每个特征所对应的参数 \n",
    "lrl2 = LR(penalty=\"l2\",solver=\"liblinear\",C=0.5,max_iter=1000) \n",
    "lrl1 = lrl1.fit(X,y) \n",
    "lrl1.coef_ \n",
    "(lrl1.coef_ != 0).sum(axis=1) \n",
    "lrl2 = lrl2.fit(X,y) \n",
    "lrl2.coef_"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "suitable-sphere",
   "metadata": {},
   "source": [
    "### L1和L2的区别"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "advanced-jerusalem",
   "metadata": {},
   "source": [
    "岭回归和lasso回归在线性回归中解决多重共线性问题，在逻辑回归中解决过拟合问题。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "stupid-solution",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "                   intercept_scaling=1, l1_ratio=None, max_iter=100,\n",
       "                   multi_class='auto', n_jobs=None, penalty='l2',\n",
       "                   random_state=None, solver='lbfgs', tol=0.0001, verbose=0,\n",
       "                   warm_start=False)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "LR(\n",
    "    penalty='l2',   #L2正则化-----对应岭回归。L1正则化------对应lasso。默认L2\n",
    "    dual=False,\n",
    "    tol=0.0001,\n",
    "    C=1.0,          # C越小，表示惩罚力度越大；反之，惩罚力度越小。\n",
    "    fit_intercept=True,\n",
    "    intercept_scaling=1,\n",
    "    class_weight=None,\n",
    "    random_state=None,\n",
    "    solver='lbfgs',   #梯度下降的方式。常用liblinear----坐标下降法\n",
    "    max_iter=100      #梯度下降的最大迭代次数\n",
    "    multi_class='auto',\n",
    "    verbose=0,\n",
    "    warm_start=False,\n",
    "    n_jobs=None,\n",
    "    l1_ratio=None,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "hollywood-terrain",
   "metadata": {},
   "outputs": [],
   "source": [
    "lr2 = LR(penalty='l2', \n",
    "   solver='liblinear',\n",
    "   C=0.5,\n",
    "   max_iter=1000  ).fit(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "baking-compromise",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9560632688927944"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr2.score(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "equivalent-elements",
   "metadata": {},
   "outputs": [],
   "source": [
    "lr1 = LR(penalty='l1', \n",
    "   solver='liblinear',\n",
    "   C=0.5,\n",
    "   max_iter=1000  ).fit(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "brown-perspective",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9578207381370826"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr1.score(X,y)  #l1的得分比l2稍微高一点点"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ceramic-receipt",
   "metadata": {},
   "source": [
    "L1正则化可以对特征进行筛选，防止过拟合，只保留对预测有用的特征        \n",
    "对当前数据集来说，特征减少至1/3,精度还是控制在96%。    \n",
    "说明剩下的特征是重要特征，可以很好的体现x和y的关系"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "novel-tiger",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 3.98672512,  0.03155015, -0.13512399, -0.01620991,  0.        ,\n",
       "         0.        ,  0.        ,  0.        ,  0.        ,  0.        ,\n",
       "         0.        ,  0.50400968,  0.        , -0.07126601,  0.        ,\n",
       "         0.        ,  0.        ,  0.        ,  0.        ,  0.        ,\n",
       "         0.        , -0.24539813, -0.12842917, -0.0144212 ,  0.        ,\n",
       "         0.        , -2.05525094,  0.        ,  0.        ,  0.        ]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr1.coef_  #w参数值"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "armed-purchase",
   "metadata": {},
   "source": [
    "L2则所有特征全部保留，只让其无限接近于0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "pending-picking",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.58651399e+00,  1.05063447e-01,  4.48683632e-02,\n",
       "        -3.74375536e-03, -8.56901613e-02, -2.94287943e-01,\n",
       "        -4.37733190e-01, -2.07600072e-01, -1.22519137e-01,\n",
       "        -1.87465544e-02,  2.78262183e-02,  8.41924650e-01,\n",
       "         1.66118667e-01, -9.75336736e-02, -8.75079523e-03,\n",
       "        -3.14114111e-02, -6.23724835e-02, -2.55180879e-02,\n",
       "        -2.58371386e-02, -1.14472251e-03,  1.34078040e+00,\n",
       "        -3.01592084e-01, -1.79752694e-01, -2.25790709e-02,\n",
       "        -1.57048116e-01, -8.65467461e-01, -1.12967239e+00,\n",
       "        -3.98774604e-01, -3.79997636e-01, -8.51004287e-02]])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr2.coef_ #w参数值"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "nutritional-grenada",
   "metadata": {},
   "source": [
    " 特征越多，模型复杂度越高，更容易把噪声学习到模型中，导致过拟合（模型泛化能力下降）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "eight-african",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.00000000e+00, 4.60569200e-15],\n",
       "       [9.99999968e-01, 3.22843928e-08],\n",
       "       [9.99999895e-01, 1.04558651e-07],\n",
       "       ...,\n",
       "       [9.97406595e-01, 2.59340481e-03],\n",
       "       [1.00000000e+00, 1.55757877e-10],\n",
       "       [4.66193956e-02, 9.53380604e-01]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#对每一行进行预测\n",
    "lr2.predict_proba(X) #对应 0 1的概率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "forbidden-numbers",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "       1., 1., 1., 1., 1., 1., 1., 1.])"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "lr2.predict_proba(X).sum(axis = 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "timely-briefs",
   "metadata": {},
   "source": [
    "### 绘制学习曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "serious-guinea",
   "metadata": {},
   "outputs": [],
   "source": [
    "#区分数据集\n",
    "Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size = 0.3,random_state = 420)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "aging-rebecca",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1f5dc20a9e8>"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x432 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#查看c在L1、L2下训练集和测试集的表现\n",
    "l1 = []\n",
    "l2 = []\n",
    "\n",
    "l1test = []\n",
    "l2test = []\n",
    "\n",
    "for i in np.linspace(0.05,1,19):\n",
    "    lrl1 = LR(penalty=\"l1\",solver=\"liblinear\",C=i,max_iter=1000) \n",
    "    lrl2 = LR(penalty=\"l2\",solver=\"liblinear\",C=i,max_iter=1000) \n",
    "    lrl1 = lrl1.fit(Xtrain,Ytrain) \n",
    "    l1.append(accuracy_score(lrl1.predict(Xtrain),Ytrain)) \n",
    "    l1test.append(accuracy_score(lrl1.predict(Xtest),Ytest)) \n",
    "    lrl2 = lrl2.fit(Xtrain,Ytrain) \n",
    "    l2.append(accuracy_score(lrl2.predict(Xtrain),Ytrain)) \n",
    "    l2test.append(accuracy_score(lrl2.predict(Xtest),Ytest)) \n",
    "graph = [l1,l2,l1test,l2test] \n",
    "color = [\"green\",\"black\",\"lightgreen\",\"gray\"] \n",
    "label = [\"L1\",\"L2\",\"L1test\",\"L2test\"] \n",
    "plt.figure(figsize=(6,6)) \n",
    "for i in range(len(graph)): \n",
    "    plt.plot(np.linspace(0.05,1,19),graph[i],color[i],label=label[i]) \n",
    "plt.legend(loc=4) #图例的位置?4表示，右下⻆\n",
    "\n",
    "#解释曲线逐渐上升原因：随着i增大c逐渐增大，c越大惩罚力度越小"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "prospective-armenia",
   "metadata": {},
   "source": [
    "想要训练集和测试集得分都高------大约是c=0.8左右    \n",
    "实际使用时，默认使用L2正则化，如果模型效果不好，就换L1试试看"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "proud-latest",
   "metadata": {},
   "outputs": [],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "valued-mitchell",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1f5dce19fd0>"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYMAAAD4CAYAAAAO9oqkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3df3xcdZ3v8dcnv5r+SJr+CCVtCim1AhGhYOwFUURZoYVKF9DdchfZByv28riioO5q1ftY96597APurghe2O12BZGrd1HR1sJ2gRWr7PVXKSYF2gKGttB0piUtTNIfmaRJPvePOSnTYZKcJJOcZOb9fDz6yJxfM585mc4733PO93vM3RERkcJWFHUBIiISPYWBiIgoDERERGEgIiIoDEREBCiJuoBsZs+e7XV1dVGXISIyYTz77LMH3b16uNuPyzCoq6tj69atUZchIjJhmNmrI9leh4lERERhICIiCgMREUFhICIiKAxERASFgYiIoDAQERHGaT+Dierfnovz0v72qMsQkQlqyqQSbvngwkheW2GQI4eOdPLZhxvp6XXMoq5GRCai2dMmKQwmuseei9PT6zx++wc469TKqMsRERkSnTPIkQ1N+zjr1AoFgYhMSAqDHNhz8CiNryW45vx5UZciIjIsCoMc2NC0DzO4evHcqEsRERkWhcEIuTsbGvdx0RmzqJk+OepyRESGRWEwQk17E+w5dIw/1iEiEZnAFAYjtKFxH5NKilh6zqlRlyIiMmwKgxE43tPLo8/F+aP6OVSWl0ZdjojIsCkMRuA//9DKG0e7uGaxDhGJyMSmMBiB9Y0xqqaUcsk7h33bURGRcUFhMEyHk8d5cvt+lp9bQ1mJdqOITGyhvsXMbKmZvWRmzWa2OsvyGWa23syeM7MtZnZO2rIqM3vEzF40s51mdlEu30BUnth+gM7uXnU0E5G8MGgYmFkxcB+wDKgHrjez+ozVvgI0ufu5wI3APWnL7gEed/ezgPOAnbkoPGobGvcxf+ZkLjhtRtSliIiMWJiWwRKg2d13uXsX8DCwImOdeuApAHd/EagzszlmVglcAtwfLOty90TOqo/IgfYkv3rlINcsnodpiFIRyQNhwmAesDdtuiWYl24bcC2AmS0BTgdqgTOAVuA7ZtZoZt82s6nZXsTMVpnZVjPb2traOsS3MbYe3RbDHVboEJGI5IkwYZDtT1/PmL4DmGFmTcBngEagm9QQ2RcA/+Tu5wNHgbedcwBw93Xu3uDuDdXV4/vqnPWN+zivdjoLq6dFXYqISE6ECYMWYH7adC0QS1/B3dvd/SZ3X0zqnEE1sDvYtsXdfxes+gipcJiwXj5wmO2xdg0/ISJ5JUwYPAMsMrMFZlYGrAQ2pq8QXDFUFkzeDDwdBMR+YK+ZnRksuwzYkaPaI7GhcR/FRcbyczVCqYjkj0HvdObu3WZ2K/AEUAw84O7bzeyWYPla4GzgITPrIfVl/8m0p/gM8P0gLHYBN+X4PYyZ3l7np00xPrBoNtUVk6IuR0QkZ0Ld9tLdNwGbMuatTXv8G2BRP9s2AQ0jqHHceGbPG+xLdPDFpWcOvrKIyASirrNDsKFpH1PKivlI/ZyoSxERySmFQUjJ4z089lycpe86lSlloRpUIiIThsIgpF+89DqHk926ikhE8pLCIKT1jfuYPW0S71s4K+pSRERyTmEQQuJYF5tfbOXq8+ZSUqxdJiL5R99sIWx6fj9dPRqhVETyl8IghA2N+1hYPZVz5lVGXYqIyKhQGAyi5c1jbNnzBtecrxFKRSR/KQwG8dOm1DBMK3SfYxHJYwqDAbg76xv38d66GcyfOSXqckRERo3CYADbY+00v35EfQtEJO8pDAawoXEfpcXGVe+uiboUEZFRpTDoR0+v89NtMT505ilUTSkbfAMRkQlMYdCPX79ykNbDnepbICIFQWHQj/WN+6goL+FDZ50SdSkiIqNOYZDFsa5unnhhP1e9u4by0uKoyxERGXUKgyz+Y8cBjnb16CoiESkYCoMsNjTuY+70cpbUzYy6FBGRMaEwyHDwSCdP/+EgVy+eR1GRhp8QkcKgMMjw2LYYPb2uq4hEpKCECgMzW2pmL5lZs5mtzrJ8hpmtN7PnzGyLmZ2TsbzYzBrN7LFcFT5aNjTFOLumkjNPrYi6FBGRMTNoGJhZMXAfsAyoB643s/qM1b4CNLn7ucCNwD0Zy28Ddo683NG1++BRmvYmuOb8uVGXIiIypsK0DJYAze6+y927gIeBFRnr1ANPAbj7i0Cdmc0BMLNa4Crg2zmrepRsaNyHGVx9ng4RiUhhCRMG84C9adMtwbx024BrAcxsCXA6UBssuxv4ItA70IuY2Soz22pmW1tbW0OUlXuPbovxvoWzOHV6eSSvLyISlTBhkO2SGs+YvgOYYWZNwGeARqDbzJYDr7v7s4O9iLuvc/cGd2+orq4OUVZudXb3sOvgUZbU6Yb3IlJ4SkKs0wLMT5uuBWLpK7h7O3ATgKVuB7Y7+LcSuNrMrgTKgUoz+56735CD2nPqQFsnADVVahWISOEJ0zJ4BlhkZgvMrIzUF/zG9BXMrCpYBnAz8LS7t7v7l9291t3rgu1+Ph6DACDW1gHA3OmTI65ERGTsDdoycPduM7sVeAIoBh5w9+1mdkuwfC1wNvCQmfUAO4BPjmLNoyIehIFaBiJSiMIcJsLdNwGbMuatTXv8G2DRIM/xC+AXQ65wjMQSSUAtAxEpTOqBHIi3dVA1pZTJZcMcpbS7C777UfjBDdD6cm6LExEZZQqDQDyRpGYkrYJffwt2Pw3NT8E/XgiP3gbt8dwVKCIyihQGgVhbkrnD7V/wxm54+u+hfgXc/jws+RQ0fh++dT489beQbMttsSIiOaYwCMTbOoZ38tgdNv0lFJXA0jtg6mxYdifc+gycvRz+8xtwz2L4zT9Cd2fuCxcRyQGFAdDR1UPi2PHhHSba8VNo/hl8+H9AZdqYRjMXwHXfhlW/hJrz4Ikvw70N8NwPoXfAztgiImNOYUBaH4OhtgyS7fD4ajj1XHjvp7KvM3cx3LgBPrEeyqvgJ5+Cf74kFSCe2ZFbRCQaCgNSJ4+BobcMNv8dHN4Py++G4kGu0l344VQr4br7obMdvncdPHQ1xBqHWbWISO4oDBhm7+NYE2z5Z2j4C6h9T7htiorg3R9LnU9Yeicc2A7rLoUf3QRv7Bp64SIiORKq01m+62sZzJk+KdwGvT3w2Odgyiy47K+H/oIlk+DCW2Dxf4Vf/2/4zb2wc2MqWBZdTvaxAUUk7xWXwhkfjOSlFQakriSaPW0Sk0pCdjh79jsQ+z1c+22YXDX8Fy6vhA9/Fd77SfjlnfDM/bBl3fCfT0QmtqmnwF/9IZKXVhgQ9DEIe/L48AH42d/Cgg+mDvnkQsWpsPyb8IEvqKOaSCEb7NzjKFIYAPFEB2dUTw238pNfhe4OuOousBwfzplem/onIjLGCv4EsrsTS3SEu5Lolc3w/I/g/Z+H2e8Y/eJERMZIwYdBe7Kbo109gx8mOp6Ef/sCzDwD3v+5sSlORGSMFPxhohP3MRisZfCru+GNV1Kdx0p1zwMRyS8F3zLou6x0wJbBoVdSYwyd87FU5zERkTxT8GEQG6xl4A7/9nkomQxX/N0YViYiMnZ0mCiRpMjglIp+Opy98GPY9Qu48h+gYs6Y1iYiMlbUMmjrYE5lOSXFWXZFRwIe/zLMvSDVO1hEJE+pZZBIUtPfTW1+/nU4dhD+7EdQNMzbYYqITAAF3zJI3dQmy/mClmdTw0Ms+W+pYahFRPJYqDAws6Vm9pKZNZvZ6izLZ5jZejN7zsy2mNk5wfz5ZrbZzHaa2XYzuy3Xb2Ak3J14tttd9nTDY7enhon40FeiKU5EZAwNGgZmVgzcBywD6oHrzaw+Y7WvAE3ufi5wI3BPML8b+IK7nw1cCHw6y7aReeNoF53dvW+/kuiZf4H9z6VuY1leGU1xIiJjKEzLYAnQ7O673L0LeBhYkbFOPfAUgLu/CNSZ2Rx3j7v774P5h4GdwLycVT9C8ba+PgZpYdAeg5+vgXd8JHWDexGRAhAmDOYBe9OmW3j7F/o24FoAM1sCnA6cNOKamdUB5wO/y/YiZrbKzLaa2dbW1tYwtY9YLJHldpePr4bebrjy73M/EJ2IyDgVJgyyfSNm3rz3DmCGmTUBnwEaSR0iSj2B2TTgx8Dt7t6e7UXcfZ27N7h7Q3V1dajiR6qvZXDiMNHLT6ZucH/JX6VuaC8iUiDCXFraAsxPm64FYukrBF/wNwGYmQG7g3+YWSmpIPi+u/8kBzXnTKytg7LiImZNLUvNePKrMPtMeN9noy1MRGSMhWkZPAMsMrMFZlYGrAQ2pq9gZlXBMoCbgafdvT0IhvuBne5+Vy4Lz4V4Ismp08spKjLoOgoHX4Zz/wRKygbfWEQkjwzaMnD3bjO7FXgCKAYecPftZnZLsHwtcDbwkJn1ADuATwabXwx8Ang+OIQE8BV335Tj9zEs8baOtzqcvflq6qcOD4lIAQrVAzn48t6UMW9t2uPfAIuybPf/GMd3d48lkixZMDM18eae1M8ZdVGVIyISmYLtgdzT6xxoTxuK4kQYqGUgIoWnYMPg4JFOunv9raEo3twDkyph8oxI6xIRiULBhsGJPgbpLYMZp6tvgYgUpIINg7f1MXhzD1SdHl1BIiIRKtgwOKn3sTskXtXJYxEpWAUbBvG2JJNLi5k+uRSOHIDupMJARApWAYdBBzVV5ZiZriQSkYJXsGEQSySZm36+ANQyEJGCVbBhcHLv4z2AQdX8gTYREclbBRkGx3t6ef1w58l9DCrnQcmkSOsSEYlKQYbBgfYk7ln6GIiIFKiCDIMTfQxOtAx0WamIFLaCDIOTeh8fT8LhmMJARApaQYbBSS2DxGupmQoDESlghRkGiQ4qykuYNqlEl5WKiFCgYRBrUx8DEZF0BRkGfb2PgVQYlE6BqdWR1iQiEqXCDINE8q3RShOvpkYr1dDVIlLACi4Mksd7OHS0K6OPQV2UJYmIRK7gwmB/+pVE7goDERFChoGZLTWzl8ys2cxWZ1k+w8zWm9lzZrbFzM4Ju+1Yi7Wl9TE4dgi6jigMRKTgDRoGZlYM3AcsA+qB682sPmO1rwBN7n4ucCNwzxC2HVPxRFrLQFcSiYgA4VoGS4Bmd9/l7l3Aw8CKjHXqgacA3P1FoM7M5oTcdkzFg5ZBzfRyhYGISCBMGMwD9qZNtwTz0m0DrgUwsyXA6UBtyG3HVKwtycypZZSXFsObu1Mzq06LsiQRkciFCYNs11x6xvQdwAwzawI+AzQC3SG3Tb2I2Soz22pmW1tbW0OUNTyxRPp9DF6FaXOgbMqovZ6IyERQEmKdFiD9ri+1QCx9BXdvB24CMDMDdgf/pgy2bdpzrAPWATQ0NGQNjFyIJ5LMnxl8+etKIhERIFzL4BlgkZktMLMyYCWwMX0FM6sKlgHcDDwdBMSg2461WFsHc6vSWgYKAxGRwVsG7t5tZrcCTwDFwAPuvt3MbgmWrwXOBh4ysx5gB/DJgbYdnbcyuCOd3RxOdqd6H3d3QXuLwkBEhHCHiXD3TcCmjHlr0x7/BlgUdtuoxPvuY1BVDm17wXsVBiIiFFgP5FjQ+3iu+hiIiJykoMKgr2VwUh+DKt37WESkoMIg1pbEDOZUlqdGKy0ug4qaqMsSEYlcQYVBPNHBKRWTKC0uSrUMqk6HooLaBSIiWRXUN2G8Le0+BupjICJyQkGFwcl9DPYoDEREAgUTBu7+1h3OOt6EZJvCQEQkUDBh0NZxnI7jPRqtVEQki4IJg1giWx8DXVYqIgIFFAYn38fg1dRM9TEQEQEKKAze1vt4yiwor4y2KBGRcaJgwiCe6KCkyJg9bZKuJBIRyVA4YdCWZE5lOcVFpjAQEclQMGEQSwR9DHq6UyOWKgxERE4omDA40fu4fR/0disMRETSFEQY9PY6+9uS1FQFA9SBriQSEUlTEGFw6GgXXT29zJ2u+xiIiGRTEGFwch+DPVBUApXzoi1KRGQcKYgweFvv4+nzoTjUHT9FRApCQYTB21oGOkQkInKSAgmDJJNKipg5tUxhICKSRagwMLOlZvaSmTWb2eosy6eb2aNmts3MtpvZTWnLPhfMe8HM/tXMynP5BsKIJTqomV6OdR2BY4cUBiIiGQYNAzMrBu4DlgH1wPVmVp+x2qeBHe5+HnAp8A0zKzOzecBngQZ3PwcoBlbmsP5QTvQx6BugTqOVioicJEzLYAnQ7O673L0LeBhYkbGOAxVmZsA04A2gO1hWAkw2sxJgChDLSeVDEE90pPoY6LJSEZGswoTBPGBv2nRLMC/dvcDZpL7onwduc/ded98H/APwGhAH2tz9yWwvYmarzGyrmW1tbW0d4tvoX0+vc+Bwp/oYiIgMIEwYWJZ5njF9BdAEzAUWA/eaWaWZzSDVilgQLJtqZjdkexF3X+fuDe7eUF1dHfoNDOb1w0l6ev2tlkH5dJg8I2fPLyKSD8KEQQswP226lrcf6rkJ+ImnNAO7gbOAPwJ2u3urux8HfgK8b+Rlh3eij0Ffy0CtAhGRtwkTBs8Ai8xsgZmVkToBvDFjndeAywDMbA5wJrArmH+hmU0JzidcBuzMVfFhnOhjUKU+BiIi/Rm0G667d5vZrcATpK4GesDdt5vZLcHytcDXgQfN7HlSh5W+5O4HgYNm9gjwe1InlBuBdaPzVrKLBy2DmspJqUHqzrpyLF9eRGRCCDUmg7tvAjZlzFub9jgGXN7Ptl8DvjaCGkck1tbB1LJiKo8fhJ4ujVYqIpJF3vdAjieS1FRNxvqGrtZhIhGRt8n/MGjreGtMIlAYiIhkkfdhEGtLvnUlkRWlRiwVEZGT5HUYdHX3cvBI51tXElXWQklZ1GWJiIw7eR0GB9qTuKf3MdDJYxGRbPI6DGKJ9D4Gr+p8gYhIP/I6DOJtQe/jKcCR/WoZiIj0I6/DYF/QMpjLgdSMGQsirEZEZPzK6zCIt3VQNaWUyUdaUjN0mEhEJKv8DoNE301t9qRmKAxERLLK6zBI9TEIListmwZTZkVdkojIuJTXYRBv6zh5tFLLdmsGERHJ2zDo6Oohcex46jBRQpeViogMJG/DIBbcx2Du9EmploFGKxUR6VfehkHffQxOm3QUjh9Ty0BEZAB5GwZ9LYN5/npqhsJARKRfeRsGfS2DWceD2zUrDERE+pW/YdDWwexpkyhtfy01o+q0aAsSERnH8jYMYm1J5vZdVloxF0rLoy5JRGTcytswiCf67nCmy0pFRAaTv2HQljYUhUYrFREZUKgwMLOlZvaSmTWb2eosy6eb2aNmts3MtpvZTWnLqszsETN70cx2mtlFuXwD2bQnj3Oks5vayiJo36eWgYjIIAYNAzMrBu4DlgH1wPVmVp+x2qeBHe5+HnAp8A0z67u/5D3A4+5+FnAesDNHtfer70qiM0reAFxhICIyiDAtgyVAs7vvcvcu4GFgRcY6DlSYmQHTgDeAbjOrBC4B7gdw9y53T+Ss+n709TGYb+pjICISRpgwmAfsTZtuCealuxc4G4gBzwO3uXsvcAbQCnzHzBrN7NtmNjXbi5jZKjPbamZbW1tbh/o+TtLXMqjujqdmKAxERAYUJgyyDfXpGdNXAE3AXGAxcG/QKigBLgD+yd3PB44CbzvnAODu69y9wd0bqqurw9afVbytgyKDyo59UFIO0+aM6PlERPJdmDBoAeanTdeSagGkuwn4iac0A7uBs4JtW9z9d8F6j5AKh1EVSySZU1lOUdurqQHqNHS1iMiAwoTBM8AiM1sQnBReCWzMWOc14DIAM5sDnAnscvf9wF4zOzNY7zJgR04qH0C8ra+PwR4dIhIRCaFksBXcvdvMbgWeAIqBB9x9u5ndEixfC3wdeNDMnid1WOlL7n4weIrPAN8PgmQXqVbEqIq3JamvqYDXXoXT3jfaLyciMuENGgYA7r4J2JQxb23a4xhweT/bNgENI6hxSNydWKKDjy6aBJ3tahmIiISQdz2Q3zx2nM7uXt5REjRMFAYiIoMK1TKYSGKJVB+D04rUx0AkXx0/fpyWlhaSyWTUpYy58vJyamtrKS0tzenz5l0YxNtSH445PQdSMzQukUjeaWlpoaKigrq6OqyArhZ0dw4dOkRLSwsLFizI6XPn3WGieND7uKpzH0ythrKsfdxEZAJLJpPMmjWroIIAwMyYNWvWqLSI8i4MYokkpcVG+ZG9OkQkkscKLQj6jNb7zrswiLd1cOr0ckx9DEREQsu/MEgkqa0shbYWhYGIjJpp06YB0NTUxEUXXcS73vUuzj33XH7wgx9EXNnw5N0J5FhbB1fUdID3KAxEZNRNmTKFhx56iEWLFhGLxXjPe97DFVdcQVVVVdSlDUlehUFvr3OgPcmiukOpGQoDkbz3Px/dzo5Ye06fs35uJV/76LtCrfvOd77zxOO5c+dyyimn0NraOuHCIK8OEx080snxHud0C4bAVhiIyBjasmULXV1dLFy4MOpShiyvWgaxoI/Bqb37oagUKmoirkhERlvYv+BHWzwe5xOf+ATf/e53KSqaeH9nT7yKBxAPeh/P7IpB1WlQVBxxRSJSCNrb27nqqqtYs2YNF154YdTlDEtehUFfy2DqMV1JJCJjo6uri2uuuYYbb7yRj3/841GXM2x5FQbxRAeTS4spbntVYSAiY+KHP/whTz/9NA8++CCLFy9m8eLFNDU1RV3WkOXVOYN4W5J3TO/GjrypMBCRUXXkyBEAbrjhBm644YaIqxm5vGoZxNo6OHdKW2pCYSAiElpehUE8keSdk9THQERkqPImDHp7namTinlHad9NbTR0tYhIWHkTBkVFxlNfuJSLZx6ByTOgfHrUJYmITBh5EwYnaLRSEZEhCxUGZrbUzF4ys2YzW51l+XQze9TMtpnZdjO7KWN5sZk1mtljuSq8XwoDEZEhGzQMzKwYuA9YBtQD15tZfcZqnwZ2uPt5wKXAN8ysLG35bcDOnFQ8kN4eSLymMBCRURdmCOu7776bY8eODev5N2zYwI4dO3JSaxhhWgZLgGZ33+XuXcDDwIqMdRyosNQteKYBbwDdAGZWC1wFfDtnVfenPQa9xxUGIjJm+oaw3r59O48//ji33347iUQCmFhhEKbT2Txgb9p0C/BfMta5F9gIxIAK4E/dvTdYdjfwxWB+v8xsFbAK4LTTTgtRVhaJV1M/FQYihePfV8P+53P7nKe+G5bdEWrV/oawfuihh4jFYnzoQx9i9uzZbN68mSeffJKvfe1rdHZ2snDhQr7zne8wbdo0Vq9ezcaNGykpKeHyyy/n2muvZePGjfzyl79kzZo1/PjHPx71kVDDhEG2G256xvQVQBPwYWAh8B9m9p/AJcDr7v6smV060Iu4+zpgHUBDQ0Pm84fz5p7UzypdVioiYy99COvPfvaz3HXXXWzevJnZs2dz8OBB1qxZw89+9jOmTp3KnXfeyV133cWtt97K+vXrefHFFzEzEokEVVVVXH311SxfvpyPfexjY1J7mDBoAeanTdeSagGkuwm4w90daDaz3cBZwMXA1WZ2JVAOVJrZ99x9dPpuv7kHrBim147K04vIOBTyL/jRNtgQ1r/97W/ZsWMHF198MZAa4O6iiy6isrKS8vJybr75Zq666iqWL18+1qUD4c4ZPAMsMrMFwUnhlaQOCaV7DbgMwMzmAGcCu9z9y+5e6+51wXY/H7UggFQYTK+F4tJRewkRkUxhhrB2dz7ykY/Q1NREU1MTO3bs4P7776ekpIQtW7Zw3XXXsWHDBpYuXTrG1acMGgbu3g3cCjxB6oqgH7r7djO7xcxuCVb7OvA+M3seeAr4krsfHK2i+6XLSkVkjA00hHVFRQWHDx8G4MILL+RXv/oVzc3NABw7doyXX36ZI0eO0NbWxpVXXsndd999YsTT9G3HQqhRS919E7ApY97atMcx4PJBnuMXwC+GXOFQvLkHzrxyVF9CRCRd3xDWhw4d4sEHHwQ4MZz1qlWrWLZsGTU1NWzevJkHH3yQ66+/ns7OTgDWrFlDRUUFK1asIJlM4u5885vfBGDlypV86lOf4lvf+haPPPLIqJ9AttRh/vGloaHBt27dOrSNentgw3+HhR+G8/50dAoTkXFh586dnH322VGXEZls79/MnnX3huE+Z/7cz6CoGK7956irEBGZkPJvbCIRERkyhYGITEjj8RD3WBit960wEJEJp7y8nEOHDhVcILg7hw4dory8POfPnT/nDESkYNTW1tLS0kJra2vUpYy58vJyamtz37FWYSAiE05paSkLFiyIuoy8osNEIiKiMBAREYWBiIgwTnsgm1kr8OoQN5sNjP14SOGpvpFRfSOj+kZuvNd4prsPeN+YgYzLE8juXj3Ubcxs60i6Yo821Tcyqm9kVN/IjfcazWyIY/icTIeJREREYSAiIvkVBuuiLmAQqm9kVN/IqL6RG+81jqi+cXkCWURExlY+tQxERGSYFAYiIpIfYWBmS83sJTNrNrPV46Ce+Wa22cx2mtl2M7stmP83ZrbPzJqCf5Hdo9PM9pjZ80EdW4N5M83sP8zsD8HPGRHVdmbaPmoys3Yzuz3K/WdmD5jZ62b2Qtq8fveXmX05+Dy+ZGZXRFTf35vZi2b2nJmtN7OqYH6dmXWk7ce1/T/zqNbX7+9znOy/H6TVtsfMmoL5Uey//r5TcvcZdPcJ/Q8oBl4BzgDKgG1AfcQ11QAXBI8rgJeBeuBvgL+Mep8Fde0BZmfM+1/A6uDxauDOcVBnMbAfOD3K/QdcAlwAvDDY/gp+19uAScCC4PNZHEF9lwMlweM70+qrS18vwv2X9fc5XvZfxvJvAH8d4f7r7zslZ5/BfGgZLAGa3X2Xu3cBDwMroizI3ePu/vvg8WFgJzAvyppCWgF8N3j8XeCPI6ylz2XAK+4+1B7pOeXuTwNvZMzub3+tAB5290533w00k/qcjml97v6ku3cHk78Fcj/ucUj97L/+jIv918fMDPgT4F9Hs4aBDPCdkrPPYD6EwTxgb9p0C+Poi9fM6oDzgd8Fs24Nmu0PRHUYJuDAk2b2rJmtCubNcfc4pD58wCmRVfeWlYop0ogAAAJpSURBVJz8n3C87D/of3+Nx8/kXwD/nja9wMwazeyXZvaBqIoi++9zvO2/DwAH3P0PafMi238Z3yk5+wzmQxhYlnnj4npZM5sG/Bi43d3bgX8CFgKLgTippmdULnb3C4BlwKfN7JIIa8nKzMqAq4EfBbPG0/4byLj6TJrZV4Fu4PvBrDhwmrufD3we+L9mVhlBaf39PsfV/gOu5+Q/SCLbf1m+U/pdNcu8AfdhPoRBCzA/bboWiEVUywlmVkrql/Z9d/8JgLsfcPced+8F/oVRbvoOxN1jwc/XgfVBLQfMrAYg+Pl6VPUFlgG/d/cDML72X6C//TVuPpNm9ufAcuDPPDiYHBw6OBQ8fpbU8eR3jnVtA/w+x9P+KwGuBX7QNy+q/ZftO4UcfgbzIQyeARaZ2YLgL8mVwMYoCwqOMd4P7HT3u9Lm16Stdg3wQua2Y8HMpppZRd9jUicaXyC13/48WO3PgZ9GUV+ak/4iGy/7L01/+2sjsNLMJpnZAmARsGWsizOzpcCXgKvd/Vja/GozKw4enxHUtyuC+vr7fY6L/Rf4I+BFd2/pmxHF/uvvO4VcfgbH8oz4KJ5pv5LU2fVXgK+Og3reT6pJ9hzQFPy7Evg/wPPB/I1ATUT1nUHqSoNtwPa+fQbMAp4C/hD8nBnhPpwCHAKmp82LbP+RCqU4cJzUX12fHGh/AV8NPo8vAcsiqq+Z1HHjvs/g2mDd64Lf+zbg98BHI6qv39/neNh/wfwHgVsy1o1i//X3nZKzz6CGoxARkbw4TCQiIiOkMBAREYWBiIgoDEREBIWBiIigMBARERQGIiIC/H8SB+f2ImgChQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#确定c=0.9，关于最大迭代次数绘制学习曲线\n",
    "l2 = []\n",
    "l2test = []\n",
    "\n",
    "for i in range(1,201,10):\n",
    "    lrl2 = LR(penalty='l2',\n",
    "      solver='liblinear',\n",
    "      C =0.9,\n",
    "      max_iter=i).fit(Xtrain,Ytrain)\n",
    "    l2.append(lrl2.score(Xtrain,Ytrain))\n",
    "    l2test.append(lrl2.score(Xtest,Ytest))\n",
    "plt.plot(np.arange(1,201,10),l2,label='l2')\n",
    "plt.plot(np.arange(1,201,10),l2test,label='l2test')\n",
    "\n",
    "plt.legend(loc=4) \n",
    "#解读：25-30次左右，收敛"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "hourly-native",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([<matplotlib.axis.XTick at 0x1f5dc276c50>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc2767f0>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc276898>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc23dc18>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc26bc50>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc26b4e0>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc266198>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc266550>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc25ec88>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc25e588>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc266e10>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc23deb8>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc25ea20>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc267668>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc2671d0>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc267978>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc256b38>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dc2567f0>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dbf2a7f0>,\n",
       "  <matplotlib.axis.XTick at 0x1f5dbf36f28>],\n",
       " <a list of 20 Text xticklabel objects>)"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#确定c=0.9，关于最大迭代次数绘制学习曲线\n",
    "l2 = []\n",
    "l2test = []\n",
    "\n",
    "for i in range(1,201,10):\n",
    "    lrl2 = LR(penalty='l2',\n",
    "      solver='liblinear',\n",
    "      C =0.9,\n",
    "      max_iter=i).fit(Xtrain,Ytrain)\n",
    "    lrl2 = lrl2.fit(Xtrain,Ytrain) \n",
    "    l2.append(accuracy_score(lrl2.predict(Xtrain),Ytrain)) \n",
    "    l2test.append(accuracy_score(lrl2.predict(Xtest),Ytest))\n",
    "graph = [l2,l2test] \n",
    "color = [\"black\",\"gray\"] \n",
    "label = [\"L2\",\"L2test\"] \n",
    "\n",
    "plt.figure(figsize=(20,5)) \n",
    "for i in range(len(graph)): \n",
    "    plt.plot(np.arange(1,201,10),graph[i],color[i],label=label[i])\n",
    "plt.legend(loc=4) \n",
    "plt.xticks(np.arange(1,201,10))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "convenient-browser",
   "metadata": {},
   "source": [
    "### 算法优化参数：solver"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bulgarian-information",
   "metadata": {},
   "source": [
    "solver参数决定了我们对逻辑回归损失函数的优化方法：    \n",
    "liblinear:用坐标轴下降法迭代优化损失函数    \n",
    "lbfgs:拟牛顿法    \n",
    "newton-cg:牛顿法家族的一种，损失函数二阶导数矩阵---海森矩阵    \n",
    "sag:随机平均梯度下降，每次迭代仅用一部分样本计算梯度，适合样本数据多的时候 ，会迭代的比较快   \n",
    "---要使用下面三种，则损失函数必须可导!!!!通过导数计算的方式是不能L1正则化的"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "toxic-society",
   "metadata": {},
   "source": [
    "### 网格搜索----确定最优参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "reflected-choir",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.preprocessing import StandardScaler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "sealed-customer",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mean radius</th>\n",
       "      <th>mean texture</th>\n",
       "      <th>mean perimeter</th>\n",
       "      <th>mean area</th>\n",
       "      <th>mean smoothness</th>\n",
       "      <th>mean compactness</th>\n",
       "      <th>mean concavity</th>\n",
       "      <th>mean concave points</th>\n",
       "      <th>mean symmetry</th>\n",
       "      <th>mean fractal dimension</th>\n",
       "      <th>...</th>\n",
       "      <th>worst texture</th>\n",
       "      <th>worst perimeter</th>\n",
       "      <th>worst area</th>\n",
       "      <th>worst smoothness</th>\n",
       "      <th>worst compactness</th>\n",
       "      <th>worst concavity</th>\n",
       "      <th>worst concave points</th>\n",
       "      <th>worst symmetry</th>\n",
       "      <th>worst fractal dimension</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>17.99</td>\n",
       "      <td>10.38</td>\n",
       "      <td>122.80</td>\n",
       "      <td>1001.0</td>\n",
       "      <td>0.11840</td>\n",
       "      <td>0.27760</td>\n",
       "      <td>0.3001</td>\n",
       "      <td>0.14710</td>\n",
       "      <td>0.2419</td>\n",
       "      <td>0.07871</td>\n",
       "      <td>...</td>\n",
       "      <td>17.33</td>\n",
       "      <td>184.60</td>\n",
       "      <td>2019.0</td>\n",
       "      <td>0.1622</td>\n",
       "      <td>0.6656</td>\n",
       "      <td>0.7119</td>\n",
       "      <td>0.2654</td>\n",
       "      <td>0.4601</td>\n",
       "      <td>0.11890</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>20.57</td>\n",
       "      <td>17.77</td>\n",
       "      <td>132.90</td>\n",
       "      <td>1326.0</td>\n",
       "      <td>0.08474</td>\n",
       "      <td>0.07864</td>\n",
       "      <td>0.0869</td>\n",
       "      <td>0.07017</td>\n",
       "      <td>0.1812</td>\n",
       "      <td>0.05667</td>\n",
       "      <td>...</td>\n",
       "      <td>23.41</td>\n",
       "      <td>158.80</td>\n",
       "      <td>1956.0</td>\n",
       "      <td>0.1238</td>\n",
       "      <td>0.1866</td>\n",
       "      <td>0.2416</td>\n",
       "      <td>0.1860</td>\n",
       "      <td>0.2750</td>\n",
       "      <td>0.08902</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>19.69</td>\n",
       "      <td>21.25</td>\n",
       "      <td>130.00</td>\n",
       "      <td>1203.0</td>\n",
       "      <td>0.10960</td>\n",
       "      <td>0.15990</td>\n",
       "      <td>0.1974</td>\n",
       "      <td>0.12790</td>\n",
       "      <td>0.2069</td>\n",
       "      <td>0.05999</td>\n",
       "      <td>...</td>\n",
       "      <td>25.53</td>\n",
       "      <td>152.50</td>\n",
       "      <td>1709.0</td>\n",
       "      <td>0.1444</td>\n",
       "      <td>0.4245</td>\n",
       "      <td>0.4504</td>\n",
       "      <td>0.2430</td>\n",
       "      <td>0.3613</td>\n",
       "      <td>0.08758</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>11.42</td>\n",
       "      <td>20.38</td>\n",
       "      <td>77.58</td>\n",
       "      <td>386.1</td>\n",
       "      <td>0.14250</td>\n",
       "      <td>0.28390</td>\n",
       "      <td>0.2414</td>\n",
       "      <td>0.10520</td>\n",
       "      <td>0.2597</td>\n",
       "      <td>0.09744</td>\n",
       "      <td>...</td>\n",
       "      <td>26.50</td>\n",
       "      <td>98.87</td>\n",
       "      <td>567.7</td>\n",
       "      <td>0.2098</td>\n",
       "      <td>0.8663</td>\n",
       "      <td>0.6869</td>\n",
       "      <td>0.2575</td>\n",
       "      <td>0.6638</td>\n",
       "      <td>0.17300</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>20.29</td>\n",
       "      <td>14.34</td>\n",
       "      <td>135.10</td>\n",
       "      <td>1297.0</td>\n",
       "      <td>0.10030</td>\n",
       "      <td>0.13280</td>\n",
       "      <td>0.1980</td>\n",
       "      <td>0.10430</td>\n",
       "      <td>0.1809</td>\n",
       "      <td>0.05883</td>\n",
       "      <td>...</td>\n",
       "      <td>16.67</td>\n",
       "      <td>152.20</td>\n",
       "      <td>1575.0</td>\n",
       "      <td>0.1374</td>\n",
       "      <td>0.2050</td>\n",
       "      <td>0.4000</td>\n",
       "      <td>0.1625</td>\n",
       "      <td>0.2364</td>\n",
       "      <td>0.07678</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 31 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   mean radius  mean texture  mean perimeter  mean area  mean smoothness  \\\n",
       "0        17.99         10.38          122.80     1001.0          0.11840   \n",
       "1        20.57         17.77          132.90     1326.0          0.08474   \n",
       "2        19.69         21.25          130.00     1203.0          0.10960   \n",
       "3        11.42         20.38           77.58      386.1          0.14250   \n",
       "4        20.29         14.34          135.10     1297.0          0.10030   \n",
       "\n",
       "   mean compactness  mean concavity  mean concave points  mean symmetry  \\\n",
       "0           0.27760          0.3001              0.14710         0.2419   \n",
       "1           0.07864          0.0869              0.07017         0.1812   \n",
       "2           0.15990          0.1974              0.12790         0.2069   \n",
       "3           0.28390          0.2414              0.10520         0.2597   \n",
       "4           0.13280          0.1980              0.10430         0.1809   \n",
       "\n",
       "   mean fractal dimension  ...  worst texture  worst perimeter  worst area  \\\n",
       "0                 0.07871  ...          17.33           184.60      2019.0   \n",
       "1                 0.05667  ...          23.41           158.80      1956.0   \n",
       "2                 0.05999  ...          25.53           152.50      1709.0   \n",
       "3                 0.09744  ...          26.50            98.87       567.7   \n",
       "4                 0.05883  ...          16.67           152.20      1575.0   \n",
       "\n",
       "   worst smoothness  worst compactness  worst concavity  worst concave points  \\\n",
       "0            0.1622             0.6656           0.7119                0.2654   \n",
       "1            0.1238             0.1866           0.2416                0.1860   \n",
       "2            0.1444             0.4245           0.4504                0.2430   \n",
       "3            0.2098             0.8663           0.6869                0.2575   \n",
       "4            0.1374             0.2050           0.4000                0.1625   \n",
       "\n",
       "   worst symmetry  worst fractal dimension  label  \n",
       "0          0.4601                  0.11890      0  \n",
       "1          0.2750                  0.08902      0  \n",
       "2          0.3613                  0.08758      0  \n",
       "3          0.6638                  0.17300      0  \n",
       "4          0.2364                  0.07678      0  \n",
       "\n",
       "[5 rows x 31 columns]"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.DataFrame(X,columns = load_breast_cancer().feature_names)\n",
    "data['label'] = y\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "literary-writing",
   "metadata": {},
   "outputs": [],
   "source": [
    "Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size =0.3,random_state = 420)\n",
    "\n",
    "#对训练集和测试集做标准化-去量纲\n",
    "std  = StandardScaler().fit(Xtrain)\n",
    "Xtrain_ = std.transform(Xtrain)\n",
    "Xtest_ = std.transform(Xtest)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "spatial-exception",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score=nan,\n",
       "             estimator=LogisticRegression(C=1.0, class_weight=None, dual=False,\n",
       "                                          fit_intercept=True,\n",
       "                                          intercept_scaling=1, l1_ratio=None,\n",
       "                                          max_iter=10000, multi_class='auto',\n",
       "                                          n_jobs=None, penalty='l2',\n",
       "                                          random_state=None, solver='lbfgs',\n",
       "                                          tol=0.0001, verbose=0,\n",
       "                                          warm_start=False),\n",
       "             iid='deprecated', n_jobs=None,\n",
       "             param_grid={'C': [0.05, 0.102777777777777...\n",
       "                               0.3138888888888889, 0.36666666666666664,\n",
       "                               0.41944444444444445, 0.4722222222222222, 0.525,\n",
       "                               0.5777777777777778, 0.6305555555555556,\n",
       "                               0.6833333333333333, 0.7361111111111112,\n",
       "                               0.788888888888889, 0.8416666666666667,\n",
       "                               0.8944444444444445, 0.9472222222222223, 1.0],\n",
       "                         'solver': ['liblinear', 'sag', 'newton-cg', 'lbfgs']},\n",
       "             pre_dispatch='2*n_jobs', refit=True, return_train_score=False,\n",
       "             scoring=None, verbose=0)"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#在l2范式下，判断c和solver的最优值-----必须以字典形式传入\n",
    "p = {\n",
    "    'C':list(np.linspace(0.05,1,19)),\n",
    "    'solver':['liblinear','sag','newton-cg','lbfgs']\n",
    "}\n",
    "\n",
    "model = LR(penalty='l2',max_iter=10000)\n",
    "\n",
    "GS = GridSearchCV(model,p,cv = 5)\n",
    "GS.fit(Xtrain_,Ytrain)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "thrown-surgeon",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9874683544303797"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "GS.best_score_   #最好的评分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "aware-venezuela",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'C': 0.3138888888888889, 'solver': 'sag'}"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "GS.best_params_   #最好评分下的参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "flexible-organization",
   "metadata": {},
   "outputs": [],
   "source": [
    "#最优参数重新用于实例化模型，查看训练集和测试集下的分数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "subtle-belize",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=0.3138888888888889, class_weight=None, dual=False,\n",
       "                   fit_intercept=True, intercept_scaling=1, l1_ratio=None,\n",
       "                   max_iter=10000, multi_class='auto', n_jobs=None,\n",
       "                   penalty='l2', random_state=None, solver='sag', tol=0.0001,\n",
       "                   verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model = LR(\n",
    "    penalty='l2',\n",
    "    max_iter=10000,\n",
    "    C = GS.best_params_['C'],\n",
    "    solver=GS.best_params_['solver']\n",
    ")\n",
    "model.fit(Xtrain_,Ytrain)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "transparent-boxing",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.9874371859296482, 0.9649122807017544)"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.score(Xtrain_,Ytrain),model.score(Xtest_,Ytest)\n",
    "#训练集评分0.98,测试集评分0.96"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "usual-evening",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
